<?php

require_once("cfg/cfg.php");
require_once("lib/mysql.class.php");
require_once("lib/timer.class.php");
require_once("lib/logger.class.php");


class User
{
	private $uid = null;
	
	private $info = "";
	private $err = false;
	
	public function __construct()
	{
		$this->uid = $this->get_item($_SESSION, 'user_id', null);
		$this->init();
	}
	
	private function init()
	{
		MySQL::$url = DBURL;
		$this->db = MySQL::getInstance();
		Logger::$log_file = USR_LOG_FILE;
	}
    
	private function identify()
	{
		$this->info = "";
		
		$uid = $this->get_item($_SESSION, 'user_id', null);
		// Сессия не содержит сведений о пользователе
		if(is_null($uid))
		{
			$login = $this->get_item($_REQUEST, 'login', null);
			$passw = $this->get_item($_REQUEST, 'password', null);
			// Логин не передавался для идентификации
			if(is_null($login))
			{
				$this->uid = null;
			}
			else
			{
				if(is_null($passw))
				{
					$this->uid = null;
					$this->info = "Не указан пароль!";
				}
				else
				{
					
				}
			}
		}
		else
		{
			$this->uid = $uid;
		}
	}
	
	private function login($login, $password)
	{
		$sql = "SELECT user_id, dt, state FROM users";
	}
	
	private function load_user_info()
	{
		
	}
	
	public function get_state()
	{
		return ($this->uid == null) ? false : true;
	}
	
	public function check_call()
	{
		// а был ли звонок с телефона
		$sql = "SELECT dt FROM callers_heap WHERE phone = ".$this->phone." AND called = 'Y'";
		$this->show2($sql);
		$res = $this->db->query($sql);
		if($this->db->num_rows($res) > 0)
		{
			$row = $this->db->fetch_row($res);
			return $row[0];
		}
		else
		{
			return false;
		}
	}
	
	// регистрация звонка с телефона
	public function reg_call()
	{
		Logger::Write("REG call", $this->phone);
		$call_dt = date("Y-m-d H:i:s");
		// зарегистрирован ли номер телефона в куче
		$http_dt = $this->exists_in_heap();
		// да!
		if($http_dt)
		{
			// обновляем признак звонка у телефона в куче
			$this->upd_heap();
			//$this->ins_log($http_dt, $call_dt);
			//$this->del_heap();
		}
		// нет! телефон в куче не найден.
		else
		{
			// записываем звонок с телефона сразу в лог
			$this->ins_log(null, $call_dt);
		}
	}
	
	// регистрация телефона в куче
	public function reg_http()
	{
		Logger::Write("REG http", $this->phone);
		// проверяем не был ли он зарегистрирован в куче ранее
		$http_dt = $this->exists_in_heap();
		// зарегистрирован!
		if($http_dt)
		{
			// переносим старую регистрацию в лог
			$this->ins_log($http_dt);
			// и удалем ее из кучи
			$this->del_heap();
		}
		// заносим в кучу новую запись
		$this->ins_heap();
	}
	
	// установка признака звонка с зарегистрированного в куче телефона
	private function upd_heap()
	{
		$sql = "UPDATE callers_heap SET called = 'Y' WHERE phone = ".$this->phone." AND dt > '".date("Y-m_d H:i:s", time() - $this->timeout_sec)."'";
		$this->show2($sql);
		$this->db->query($sql);
	}
	
	// проверка существования телефона в куче
	private function exists_in_heap()
	{
		$sql = "SELECT dt FROM callers_heap WHERE phone = ".$this->phone;
		$this->show2($sql);
		$res = $this->db->query($sql);
		if ($this->db->num_rows($res) === 0) return false;
		$row = $this->db->fetch_row($res);
		return $row[0];
	}
	
	// добавляем телефон в кучу
	private function ins_heap()
	{
		$sql = "INSERT INTO callers_heap(phone) VALUES(".$this->phone.")";
		$this->show2($sql);
		$res = $this->db->query($sql);
	}
	
	private function del_heap()
	{
		$sql = "DELETE FROM callers_heap WHERE phone = (".$this->phone.")";
		$this->show2($sql);
		$res = $this->db->query($sql);
	}
	
	public function ins_log($http_dt, $call_dt = null)
	{
		$uid = $this->get_user_id();
		$sql = "INSERT INTO callers_log(call_dt, http_dt, phone, uid) VALUES(%s, %s, %s, %s)";
		$params = array(
		$this->db->escape($call_dt),
		$this->db->escape($http_dt),
		$this->db->escape($this->phone),
		$this->db->escape($uid)
		);
		$sql = vsprintf($sql, $params);
		$this->show2($sql);
		
		$res = $this->db->query($sql);
	}
	
	public function get_user_id()
	{
		$sql = "SELECT uid FROM users WHERE phone = ".$this->phone;
		$res = $this->db->query($sql);
		$this->show2($sql);
		if($this->db->num_rows($res) === 0) return null;
		$row = $this->db->fetch_row($res);
		return $row[0];
	}
	
	private function get_item($items, $key, $def = null)
	{
		if(is_null($items)) return $def;
		if(!is_array($items)) return $def;
		return isset($items[$key]) ? $items[$key] : $def;
	}
	
	private function heap2log()
	{
		$this->ins_log();
		$this->del_heap();
	}
	
	private function show2($msg)
	{
		Logger::Write("SQL", $msg);
		//echo $msg."\n";
	}
    
    private $db = null;
    
}
